import { Body, Controller, Post } from '@nestjs/common';
import { DeepSeekService } from '../services/deepseek.service';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiBody,
  ApiProperty,
} from '@nestjs/swagger';
import {
  IsArray,
  IsEnum,
  IsNumber,
  IsObject,
  IsOptional,
  IsString,
  Max,
  Min,
  ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';

/**
 * 社交媒体内容生成配置DTO
 */
class SocialMediaPostOptionsDto {
  /**
   * 平台类型
   */
  @ApiProperty({
    description: '平台类型',
    enum: ['xiaohongshu', 'xiaolvshu'],
    default: 'xiaohongshu',
    required: false,
  })
  @IsEnum(['xiaohongshu', 'xiaolvshu'])
  @IsOptional()
  platform?: 'xiaohongshu' | 'xiaolvshu';

  /**
   * 是否包含话题标签
   */
  @ApiProperty({
    description: '是否包含话题标签',
    default: true,
    required: false,
  })
  @IsOptional()
  includeHashtags?: boolean;

  /**
   * 内容长度
   */
  @ApiProperty({
    description: '内容长度',
    enum: ['short', 'medium', 'long'],
    default: 'medium',
    required: false,
  })
  @IsEnum(['short', 'medium', 'long'])
  @IsOptional()
  postLength?: 'short' | 'medium' | 'long';

  /**
   * 内容风格
   */
  @ApiProperty({
    description: '内容风格',
    enum: ['casual', 'professional', 'trendy'],
    default: 'trendy',
    required: false,
  })
  @IsEnum(['casual', 'professional', 'trendy'])
  @IsOptional()
  style?: 'casual' | 'professional' | 'trendy';

  /**
   * 图片数量
   */
  @ApiProperty({
    description: '图片数量',
    minimum: 1,
    maximum: 3,
    default: 1,
    required: false,
  })
  @IsNumber()
  @Min(1)
  @Max(3)
  @IsOptional()
  imageCount?: number;
}

/**
 * 单个社交媒体帖子生成请求DTO
 */
class GenerateSocialMediaPostRequestDto {
  /**
   * 内容模板
   */
  @ApiProperty({
    description: '内容模板',
    example: '分享一款超好用的[主题]产品，让你的[问题]迎刃而解！',
  })
  @IsString()
  template: string;

  /**
   * 关键词列表
   */
  @ApiProperty({
    description: '关键词列表',
    type: [String],
    example: ['护肤', '敏感肌', '补水'],
  })
  @IsArray()
  @IsString({ each: true })
  keywords: string[];

  /**
   * 图片生成提示词
   */
  @ApiProperty({
    description: '图片生成提示词',
    example: '一款精美的护肤品放在干净的浴室台面上，周围有绿色植物，富有生活感',
  })
  @IsString()
  imagePrompt: string;

  /**
   * 生成配置选项
   */
  @ApiProperty({
    description: '生成配置选项',
    type: SocialMediaPostOptionsDto,
    required: false,
  })
  @IsObject()
  @IsOptional()
  @ValidateNested()
  @Type(() => SocialMediaPostOptionsDto)
  options?: SocialMediaPostOptionsDto;
}

/**
 * 批量社交媒体帖子生成请求DTO
 */
class BatchGenerateSocialMediaPostsRequestDto {
  /**
   * 内容模板列表
   */
  @ApiProperty({
    description: '内容模板列表',
    type: [String],
    example: [
      '分享一款超好用的[主题]产品，让你的[问题]迎刃而解！',
      '我的[主题]心得分享，解决[问题]的秘密武器！',
    ],
  })
  @IsArray()
  @IsString({ each: true })
  templates: string[];

  /**
   * 关键词集合列表
   */
  @ApiProperty({
    description: '关键词集合列表',
    type: [[String]],
    example: [
      ['护肤', '敏感肌', '补水'],
      ['彩妆', '底妆', '遮瑕'],
    ],
  })
  @IsArray()
  @IsArray({ each: true })
  keywordSets: string[][];

  /**
   * 图片生成提示词列表
   */
  @ApiProperty({
    description: '图片生成提示词列表',
    type: [String],
    example: [
      '一款精美的护肤品放在干净的浴室台面上，周围有绿色植物，富有生活感',
      '化妆台上整齐摆放的彩妆产品，自然光线透过窗户照射，营造出温馨氛围',
    ],
  })
  @IsArray()
  @IsString({ each: true })
  imagePrompts: string[];

  /**
   * 生成配置选项
   */
  @ApiProperty({
    description: '生成配置选项',
    type: SocialMediaPostOptionsDto,
    required: false,
  })
  @IsObject()
  @IsOptional()
  @ValidateNested()
  @Type(() => SocialMediaPostOptionsDto)
  options?: SocialMediaPostOptionsDto;
}

/**
 * 社交媒体帖子生成结果DTO
 */
class SocialMediaPostResultDto {
  /**
   * 索引
   */
  @ApiProperty({
    description: '索引',
    example: 0,
  })
  index: number;

  /**
   * 使用的模板
   */
  @ApiProperty({
    description: '使用的模板',
    example: '分享一款超好用的[主题]产品，让你的[问题]迎刃而解！',
  })
  template: string;

  /**
   * 使用的关键词
   */
  @ApiProperty({
    description: '使用的关键词',
    type: [String],
    example: ['护肤', '敏感肌', '补水'],
  })
  keywords: string[];

  /**
   * 使用的图片提示词
   */
  @ApiProperty({
    description: '使用的图片提示词',
    example: '一款精美的护肤品放在干净的浴室台面上，周围有绿色植物，富有生活感',
  })
  imagePrompt: string;

  /**
   * 生成的内容
   */
  @ApiProperty({
    description: '生成的内容',
    example: '标题: 敏感肌必备！这款神仙水乳让你告别干燥泛红...',
  })
  content?: string;

  /**
   * 错误信息（如果生成失败）
   */
  @ApiProperty({
    description: '错误信息（如果生成失败）',
    required: false,
  })
  error?: string;

  /**
   * 生成状态
   */
  @ApiProperty({
    description: '生成状态',
    enum: ['success', 'error'],
    example: 'success',
  })
  status: 'success' | 'error';
}

@ApiTags('ai', 'deepseek')
@Controller('api/deepseek')
export class DeepSeekController {
  constructor(private readonly deepseekService: DeepSeekService) {}

  /**
   * 生成单个社交媒体帖子
   */
  @ApiOperation({
    summary: '生成社交媒体帖子',
    description: '使用DeepSeek V3生成小红书/小绿书爆款图文笔记',
  })
  @ApiBody({ type: GenerateSocialMediaPostRequestDto })
  @ApiResponse({
    status: 200,
    description: '成功生成社交媒体帖子',
    schema: {
      type: 'object',
      properties: {
        content: {
          type: 'string',
          example: '标题: 敏感肌必备！这款神仙水乳让你告别干燥泛红...',
        },
      },
    },
  })
  @ApiResponse({ status: 400, description: '请求参数错误' })
  @ApiResponse({ status: 500, description: 'API调用失败' })
  @Post('social-media-post')
  async generateSocialMediaPost(
    @Body() request: GenerateSocialMediaPostRequestDto,
  ) {
    const result = await this.deepseekService.generateSocialMediaPost(
      request.template,
      request.keywords,
      request.imagePrompt,
      request.options,
    );
    return {
      content: result.content,
    };
  }

  /**
   * 批量生成社交媒体帖子
   */
  @ApiOperation({
    summary: '批量生成社交媒体帖子',
    description: '使用DeepSeek V3批量生成小红书/小绿书爆款图文笔记',
  })
  @ApiBody({ type: BatchGenerateSocialMediaPostsRequestDto })
  @ApiResponse({
    status: 200,
    description: '成功生成社交媒体帖子',
    type: [SocialMediaPostResultDto],
  })
  @ApiResponse({ status: 400, description: '请求参数错误' })
  @ApiResponse({ status: 500, description: 'API调用失败' })
  @Post('batch-social-media-posts')
  async batchGenerateSocialMediaPosts(
    @Body() request: BatchGenerateSocialMediaPostsRequestDto,
  ) {
    return this.deepseekService.batchGenerateSocialMediaPosts(
      request.templates,
      request.keywordSets,
      request.imagePrompts,
      request.options,
    );
  }
}
